home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / contra.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  8KB  |  297 lines

  1. /***************************************************************************
  2.  
  3.   gryzor: vidhrdw.c
  4.  
  5. ***************************************************************************/
  6.  
  7. #include "driver.h"
  8. #include "vidhrdw/konamiic.h"
  9. #include "vidhrdw/generic.h"
  10.  
  11. //static int spriteram_offset;
  12. static unsigned char *private_spriteram_2,*private_spriteram;
  13.  
  14. unsigned char *contra_fg_vram,*contra_fg_cram;
  15. unsigned char *contra_text_vram,*contra_text_cram;
  16. unsigned char *contra_bg_vram,*contra_bg_cram;
  17.  
  18. static struct tilemap *bg_tilemap, *fg_tilemap, *tx_tilemap;
  19.  
  20. /***************************************************************************
  21. **
  22. **    Contra has palette RAM, but it also has four lookup table PROMs
  23. **
  24. **    0    sprites #0
  25. **    1    tiles   #0
  26. **    2    sprites #1
  27. **    3    tiles   #1
  28. **
  29. ***************************************************************************/
  30.  
  31. void contra_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  32. {
  33.     int i,chip,pal,clut;
  34.  
  35.     for (chip = 0;chip < 2;chip++)
  36.     {
  37.         for (pal = 0;pal < 8;pal++)
  38.         {
  39.             clut = (pal & 1) + 2 * chip;
  40.             for (i = 0;i < 256;i++)
  41.             {
  42.                 if ((pal & 1) == 0)    /* sprites */
  43.                 {
  44.                     if (color_prom[256 * clut + i] == 0)
  45.                         *(colortable++) = 0;
  46.                     else
  47.                         *(colortable++) = 16 * pal + color_prom[256 * clut + i];
  48.                 }
  49.                 else
  50.                     *(colortable++) = 16 * pal + color_prom[256 * clut + i];
  51.             }
  52.         }
  53.     }
  54. }
  55.  
  56.  
  57.  
  58. /***************************************************************************
  59.  
  60.     Callbacks for the TileMap code
  61.  
  62. ***************************************************************************/
  63.  
  64. static void get_fg_tile_info(int tile_index)
  65. {
  66.     int attr = contra_fg_cram[tile_index];
  67.     int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03;
  68.     int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03;
  69.     int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03;
  70.     int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03;
  71.     int bank = ((attr & 0x80) >> 7) |
  72.             ((attr >> (bit0+2)) & 0x02) |
  73.             ((attr >> (bit1+1)) & 0x04) |
  74.             ((attr >> (bit2  )) & 0x08) |
  75.             ((attr >> (bit3-1)) & 0x10) |
  76.             ((K007121_ctrlram[0][0x03] & 0x01) << 5);
  77.     int mask = (K007121_ctrlram[0][0x04] & 0xf0) >> 4;
  78.  
  79.     bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1);
  80.  
  81.     SET_TILE_INFO(0, contra_fg_vram[tile_index]+bank*256, ((K007121_ctrlram[0][6]&0x30)*2+16)+(attr&7) )
  82. }
  83.  
  84. static void get_bg_tile_info(int tile_index)
  85. {
  86.     int attr = contra_bg_cram[tile_index];
  87.     int bit0 = (K007121_ctrlram[1][0x05] >> 0) & 0x03;
  88.     int bit1 = (K007121_ctrlram[1][0x05] >> 2) & 0x03;
  89.     int bit2 = (K007121_ctrlram[1][0x05] >> 4) & 0x03;
  90.     int bit3 = (K007121_ctrlram[1][0x05] >> 6) & 0x03;
  91.     int bank = ((attr & 0x80) >> 7) |
  92.             ((attr >> (bit0+2)) & 0x02) |
  93.             ((attr >> (bit1+1)) & 0x04) |
  94.             ((attr >> (bit2  )) & 0x08) |
  95.             ((attr >> (bit3-1)) & 0x10) |
  96.             ((K007121_ctrlram[1][0x03] & 0x01) << 5);
  97.     int mask = (K007121_ctrlram[1][0x04] & 0xf0) >> 4;
  98.  
  99.     bank = (bank & ~(mask << 1)) | ((K007121_ctrlram[0][0x04] & mask) << 1);
  100.  
  101.     SET_TILE_INFO(1, contra_bg_vram[tile_index]+bank*256, ((K007121_ctrlram[1][6]&0x30)*2+16)+(attr&7) )
  102. }
  103.  
  104. static void get_tx_tile_info(int tile_index)
  105. {
  106.     int attr = contra_text_cram[tile_index];
  107.     int bit0 = (K007121_ctrlram[0][0x05] >> 0) & 0x03;
  108.     int bit1 = (K007121_ctrlram[0][0x05] >> 2) & 0x03;
  109.     int bit2 = (K007121_ctrlram[0][0x05] >> 4) & 0x03;
  110.     int bit3 = (K007121_ctrlram[0][0x05] >> 6) & 0x03;
  111.     int bank = ((attr & 0x80) >> 7) |
  112.             ((attr >> (bit0+2)) & 0x02) |
  113.             ((attr >> (bit1+1)) & 0x04) |
  114.             ((attr >> (bit2  )) & 0x08) |
  115.             ((attr >> (bit3-1)) & 0x10);
  116.     SET_TILE_INFO(0,contra_text_vram[tile_index]+bank*256, ((K007121_ctrlram[0][6]&0x30)*2+16)+(attr&7) )
  117. }
  118.  
  119.  
  120. /***************************************************************************
  121.  
  122.     Start the video hardware emulation.
  123.  
  124. ***************************************************************************/
  125.  
  126. int contra_vh_start(void)
  127. {
  128.     bg_tilemap = tilemap_create(get_bg_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,32,32);
  129.     fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,32,32);
  130.     tx_tilemap = tilemap_create(get_tx_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,32,32);
  131.  
  132.     private_spriteram = malloc(0x800);
  133.     private_spriteram_2 = malloc(0x800);
  134.  
  135.     if (!bg_tilemap || !fg_tilemap || !tx_tilemap)
  136.         return 1;
  137.  
  138.     {
  139.         struct rectangle clip = Machine->drv->visible_area;
  140.         clip.min_x += 40;
  141.         tilemap_set_clip( bg_tilemap, &clip );
  142.         tilemap_set_clip( fg_tilemap, &clip );
  143.  
  144.         clip.max_x = 39;
  145.         clip.min_x = 0;
  146.         tilemap_set_clip( tx_tilemap, &clip );
  147.  
  148.         fg_tilemap->transparent_pen = 0;
  149.  
  150.         return 0;
  151.     }
  152. }
  153.  
  154. void contra_vh_stop(void)
  155. {
  156.     free(private_spriteram);
  157.     free(private_spriteram_2);
  158. }
  159.  
  160.  
  161. /***************************************************************************
  162.  
  163.     Memory handlers
  164.  
  165. ***************************************************************************/
  166.  
  167. WRITE_HANDLER( contra_fg_vram_w )
  168. {
  169.     if (contra_fg_vram[offset] != data)
  170.     {
  171.         tilemap_mark_tile_dirty(fg_tilemap,offset);
  172.         contra_fg_vram[offset] = data;
  173.     }
  174. }
  175.  
  176. WRITE_HANDLER( contra_fg_cram_w ){
  177.     if (contra_fg_cram[offset] != data)
  178.     {
  179.         tilemap_mark_tile_dirty(fg_tilemap,offset);
  180.         contra_fg_cram[offset] = data;
  181.     }
  182. }
  183.  
  184. WRITE_HANDLER( contra_bg_vram_w )
  185. {
  186.     if (contra_bg_vram[offset] != data)
  187.     {
  188.         tilemap_mark_tile_dirty(bg_tilemap,offset);
  189.         contra_bg_vram[offset] = data;
  190.     }
  191. }
  192.  
  193. WRITE_HANDLER( contra_bg_cram_w )
  194. {
  195.     if (contra_bg_cram[offset] != data)
  196.     {
  197.         tilemap_mark_tile_dirty(bg_tilemap,offset);
  198.         contra_bg_cram[offset] = data;
  199.     }
  200. }
  201.  
  202. WRITE_HANDLER( contra_text_vram_w )
  203. {
  204.     if (contra_text_vram[offset] != data)
  205.     {
  206.         tilemap_mark_tile_dirty(tx_tilemap,offset);
  207.         contra_text_vram[offset] = data;
  208.     }
  209. }
  210.  
  211. WRITE_HANDLER( contra_text_cram_w )
  212. {
  213.     if (contra_text_cram[offset] != data)
  214.     {
  215.         tilemap_mark_tile_dirty(tx_tilemap,offset);
  216.         contra_text_cram[offset] = data;
  217.     }
  218. }
  219.  
  220. WRITE_HANDLER( contra_K007121_ctrl_0_w )
  221. {
  222.     if (offset == 3)
  223.     {
  224.         if ((data&0x8)==0)
  225.             memcpy(private_spriteram,spriteram+0x800,0x800);
  226.         else
  227.             memcpy(private_spriteram,spriteram,0x800);
  228.     }
  229.     if (offset == 6)
  230.     {
  231.         if (K007121_ctrlram[0][6] != data)
  232.             tilemap_mark_all_tiles_dirty( fg_tilemap );
  233.     }
  234.     if (offset == 7)
  235.         tilemap_set_flip(fg_tilemap,(data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  236.  
  237.     K007121_ctrl_0_w(offset,data);
  238. }
  239.  
  240. WRITE_HANDLER( contra_K007121_ctrl_1_w )
  241. {
  242.     if (offset == 3)
  243.     {
  244.         if ((data&0x8)==0)
  245.             memcpy(private_spriteram_2,spriteram+0x2800,0x800);
  246.         else
  247.             memcpy(private_spriteram_2,spriteram+0x2000,0x800);
  248.     }
  249.     if (offset == 6)
  250.     {
  251.         if (K007121_ctrlram[1][6] != data )
  252.             tilemap_mark_all_tiles_dirty( bg_tilemap );
  253.     }
  254.     if (offset == 7)
  255.         tilemap_set_flip(bg_tilemap,(data & 0x08) ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  256.  
  257.     K007121_ctrl_1_w(offset,data);
  258. }
  259.  
  260.  
  261.  
  262. /***************************************************************************
  263.  
  264.     Display Refresh
  265.  
  266. ***************************************************************************/
  267.  
  268. static void draw_sprites( struct osd_bitmap *bitmap, int bank )
  269. {
  270.     const unsigned char *source;
  271.     int base_color = (K007121_ctrlram[bank][6]&0x30)*2;
  272.  
  273.     if (bank==0) source=private_spriteram;
  274.     else source=private_spriteram_2;
  275.  
  276.     K007121_sprites_draw(bank,bitmap,source,base_color,40,0,-1);
  277. }
  278.  
  279. void contra_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  280. {
  281.     tilemap_set_scrollx( fg_tilemap,0, K007121_ctrlram[0][0x00] - 40 );
  282.     tilemap_set_scrolly( fg_tilemap,0, K007121_ctrlram[0][0x02] );
  283.     tilemap_set_scrollx( bg_tilemap,0, K007121_ctrlram[1][0x00] - 40 );
  284.     tilemap_set_scrolly( bg_tilemap,0, K007121_ctrlram[1][0x02] );
  285.  
  286.     tilemap_update( ALL_TILEMAPS );
  287.     if (palette_recalc())
  288.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  289.     tilemap_render( ALL_TILEMAPS );
  290.  
  291.     tilemap_draw( bitmap, bg_tilemap, 0 );
  292.     tilemap_draw( bitmap, fg_tilemap, 0 );
  293.     draw_sprites( bitmap, 0 );
  294.     draw_sprites( bitmap, 1 );
  295.     tilemap_draw( bitmap, tx_tilemap, 0 );
  296. }
  297.